<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>手写sleep函数</title>
</head>
<body>
    <script>
        // sleep 函数的作用是：让程序“暂停”一段时间后再继续执行后续代码。因此可以用异步编程定时器的方式来实现。
        function sleep(ms) {
            // {
            //     setTimeout(() => {
            //         resolve();
            //     }, ms);   ()=>{resolve()}
            // }
            let p;
            p = new Promise(resolve=> {  // 如果是在这里声明的p，那么下文的第一个console.log(p,'/////'); 就会报错，因为p还没有完成异步操作，promise对象还没有创建完成
                setTimeout(() => {
                    console.log(p,'/////');  // Promise {<pending>}  pending等待状态
                    resolve();  //  resolve() 方法将 Promise 对象的状态从“等待”改为“成功”（fulfilled），并将异步操作的结果传递给后续的 then() 方法。
                    console.log(p,'/////'); // Promise {<fulfilled>: undefined}  fulfilled成功状态
                        //  若是使用reject() 方法将 Promise 对象的状态从“等待”改为“失败”（rejected），并将异步操作的错误信息传递给后续的 catch() 方法。
                }, ms);
            });
            return p;
        }
        sleep(3000).then(()=>{
            console.log(`3秒后输出`);
        }).catch(()=>{
            console.log(`3秒后输出失败`);
        })
        .finally(()=>{ // 无论成功或失败，finally() 方法都会执行。
            // 当promise 状态从pending到了fulfilled或rejected，finally() 方法就会执行。
            console.log(`3秒后输出完成`);
        })
    </script>
</body>
</html>